package generics;

/**
 *  上界通配符 < ? extends E>
 *
 * 上界：用 extends 关键字声明，表示参数化的类型可能是所指定的类型，或者是此类型的子类。
 * 在类型参数中使用 extends 表示这个泛型中的参数必须是 E 或者 E 的子类，这样有两个好处：
 *
 * 如果传入的类型不是 E 或者 E 的子类，编译不成功
 * 泛型中可以使用 E 的方法，要不然还得强转成 E 才能使用
 * private <K extends A, E extends B> E test(K arg1, E arg2){
 *     E result = arg2;
 *     arg2.compareTo(arg1);
 *     //.....
 *     return result;
 * }
 *
 * 类型参数列表中如果有多个类型参数上限，用逗号分开
 * 下界通配符 < ? super E>
 *
 * 下界: 用 super 进行声明，表示参数化的类型可能是所指定的类型，或者是此类型的父类型，直至 Object
 * 在类型参数中使用 super 表示这个泛型中的参数必须是 E 或者 E 的父类。
 *
 * private <T> void test(List<? super T> dst, List<T> src){
 *     for (T t : src) {
 *         dst.add(t);
 *     }
 * }
 *
 * public static void main(String[] args) {
 *     List<Dog> dogs = new ArrayList<>();
 *     List<Animal> animals = new ArrayList<>();
 *     new Test3().test(animals,dogs);
 * }
 * // Dog 是 Animal 的子类
 * class Dog extends Animal {
 *
 * }
 *
 * dst 类型 “大于等于” src 的类型，这里的“大于等于”是指 dst 表示的范围比 src 要大，因此装得下 dst 的容器也就能装 src 。
 *
 * */
public class Lesson3 {

}
